﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ПараметрыЗаписиПриПроверкеПервогоАдминистратора;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
		МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	ОбщаяНастройкаПоказыватьВСпискеВыбора =
		ПользователиСлужебный.НастройкиВхода().Общие.ПоказыватьВСпискеВыбора;
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		РазделениеВключено = Истина;
		ДоступноИзменениеПользователей = Истина;
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда
			МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса");
			ДоступноИзменениеПользователей = МодульПользователиСлужебныйВМоделиСервиса.ДоступноИзменениеПользователей();
		КонецЕсли;
		
		Если НЕ ДоступноИзменениеПользователей Тогда
			Если Объект.Ссылка.Пустая() Тогда
				ВызватьИсключение НСтр("ru = 'В демонстрационном режиме создание новых учетных записей пользователей недоступно.'");
			КонецЕсли;
			ТолькоПросмотр = Истина;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Объект.Ссылка)
		   И ЗначениеЗаполнено(Объект.ИдентификаторПользователяСервиса)
		   И Объект.Ссылка <> Пользователи.АвторизованныйПользователь() Тогда
			Элементы.Отступ.Видимость = Ложь;
			Элементы.НадписьНаличиеПароля.Видимость = Ложь;
			Элементы.СменитьПароль.Видимость = Ложь;
		КонецЕсли;
		Элементы.ПользовательИБАутентификацияOpenID.Видимость = Ложь;
		Элементы.ПользовательИБАутентификацияOpenIDConnect.Видимость = Ложь;
		Элементы.ПользовательИБАутентификацияТокеномДоступа.Видимость = Ложь;
		Элементы.ПользовательИБАутентификацияСтандартная.Видимость = Ложь;
		Элементы.ПотребоватьСменуПароляПриВходе.Видимость = Ложь;
		Элементы.ПользовательИБЗапрещеноИзменятьПароль.Видимость = Ложь;
		Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Видимость = Ложь;
		Элементы.СвойстваАутентификацииОС.Видимость  = Ложь;
		Элементы.ПользовательИБРежимЗапуска.Видимость = Ложь;
	КонецЕсли;
	
	Если СтандартныеПодсистемыСервер.ЭтоУчебнаяПлатформа() Тогда
		Элементы.СвойстваАутентификацииОС.ТолькоПросмотр = Истина;
	КонецЕсли;
	
	// Заполнение вспомогательных данных.
	
	// Заполнение списка выбора режимов запуска.
	Для каждого РежимЗапуска Из РежимЗапускаКлиентскогоПриложения Цикл
		ПолноеИмяЗначения = ПолучитьПолноеИмяПредопределенногоЗначения(РежимЗапуска);
		ИмяЗначения = Сред(ПолноеИмяЗначения, СтрНайти(ПолноеИмяЗначения, ".") + 1);
		Элементы.ПользовательИБРежимЗапуска.СписокВыбора.Добавить(ИмяЗначения, Строка(РежимЗапуска));
	КонецЦикла;
	Элементы.ПользовательИБРежимЗапуска.СписокВыбора.СортироватьПоПредставлению();
	
	// Заполнение списка выбора языка.
	Если Метаданные.Языки.Количество() < 2 Тогда
		Элементы.ПользовательИБЯзык.Видимость = Ложь;
	Иначе
		Для каждого МетаданныеЯзыка Из Метаданные.Языки Цикл
			Элементы.ПользовательИБЯзык.СписокВыбора.Добавить(
				МетаданныеЯзыка.Имя, МетаданныеЯзыка.Синоним);
		КонецЦикла;
	КонецЕсли;
	
	УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(Объект);
	
	// Подготовка к интерактивным действиям с учетом сценариев открытия формы.
	УстановитьПривилегированныйРежим(Истина);
	
	Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
		// Создание нового элемента.
		Если Параметры.ГруппаНовогоПользователя <> Справочники.ГруппыПользователей.ВсеПользователи Тогда
			ГруппаНовогоПользователя = Параметры.ГруппаНовогоПользователя;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
			// Копирование элемента.
			ЗначениеКопирования = Параметры.ЗначениеКопирования;
			Объект.Наименование = "";
			ИдентификаторКопируемогоПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
				ЗначениеКопирования, "ИдентификаторПользователяИБ");
			
			Если Не ПользователиСлужебный.УровеньДоступаПользователяВыше(ЗначениеКопирования, УровеньДоступа) Тогда
				ПрочитатьПользователяИБ(ЗначениеЗаполнено(ИдентификаторКопируемогоПользователяИБ));
			Иначе
				ПрочитатьПользователяИБ();
			КонецЕсли;
			
			Если Не УровеньДоступа.ИзменениеРазрешенияНаВход Тогда
				ВходВПрограммуРазрешен = Ложь;
				ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Ложь;
			КонецЕсли;
			
			ПользовательИБАдресЭлектроннойПочты = "";
		Иначе
			// Добавление элемента.
			
			// Чтение начальных значений свойств пользователя ИБ.
			ПрочитатьПользователяИБ();
			
			Если Не ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда
				ПользовательИБАутентификацияСтандартная = Истина;
				
				Если ОбщегоНазначения.РазделениеВключено() Тогда
					ПользовательИБПоказыватьВСпискеВыбора = Ложь;
					ПользовательИБАутентификацияOpenID = Истина;
				КонецЕсли;
				
				Если УровеньДоступа.ИзменениеРазрешенияНаВход Тогда
					ВходВПрограммуРазрешен = Истина;
					ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	Иначе
		// Открытие существующего элемента.
		ПрочитатьПользователяИБ();
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Ложь);
	
	ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриСозданииФормы", ПользовательИБСуществует);
	НачальноеОписаниеПользователяИБ = НачальноеОписаниеПользователяИБ();
	ТребуетсяСинхронизацияССервисом = Объект.Ссылка.Пустая();
	
	ПарольДляПодтвержденияИзмененияПочты = Неопределено;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		
		ИсключаемыеВиды = Новый Массив;
		ИсключаемыеВиды.Добавить(ВидКонтактнойИнформации("ТелефонПользователя"));
		ИсключаемыеВиды.Добавить(ВидКонтактнойИнформации("EmailПользователя"));
		
		ДополнительныеПараметры = МодульУправлениеКонтактнойИнформацией.ПараметрыКонтактнойИнформации();
		ДополнительныеПараметры.ИмяЭлементаДляРазмещения = "КонтактнаяИнформация";
		ДополнительныеПараметры.ИсключаемыеВиды = ИсключаемыеВиды;
		
		МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, ДополнительныеПараметры);
		
		Если ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда
			
			Если Не ПользователиСлужебный.ИнтерактивноЗапрашиватьВводПароля(УровеньДоступа, Объект) Тогда
				ПарольДляПодтвержденияИзмененияПочты = "";
			КонецЕсли;
			
			ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля(
				ЭтотОбъект,
				ПользовательИБАдресЭлектроннойПочты,
				ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект));
			
		КонецЕсли;
		
		ПереопределитьРедактированиеКонтактнойИнформацииВСервисе();
	КонецЕсли;
	
	НастроитьФорму(Объект, Истина);
	
	Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда
		Элементы.ГруппаШапка.ТолькоПросмотр = Истина;
		Элементы.КонтактнаяИнформация.ТолькоПросмотр = Истина;
		Элементы.СтраницаДополнительныеРеквизиты.ТолькоПросмотр = Истина;
		Элементы.СтраницаКомментарий.ТолькоПросмотр = Истина;
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация")
		И ДействияСПользователемСервиса <> Неопределено Тогда
			МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
			МодульУправлениеКонтактнойИнформацией.УстановитьДоступностьЭлементовКонтактнойИнформации(ЭтотОбъект,
				ОпределитьДоступностьЭлементовКонтактнойИнформации());
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
		ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
	КонецЕсли;
	
	ПодготовитьНеобязательныйРеквизит("ФизическоеЛицо", Пользователи.ФизическоеЛицоИспользуется());
	ПодготовитьНеобязательныйРеквизит("Подразделение", Пользователи.ПодразделениеИспользуется());
	
	ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора();
	
	Если ОбщегоНазначения.РазделениеВключено()
		Или Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда
		Элементы.ГруппаИзменитьОграничение.Видимость = Ложь;
	КонецЕсли;
	
	Элементы.ПотребоватьСменуПароляПриВходе.РасширеннаяПодсказка.Заголовок =
		ПользователиСлужебный.ПодсказкаПотребоватьСменуПароляПриВходе(Ложь);
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ФормаЗаписатьИЗакрыть.Отображение = ОтображениеКнопки.Картинка;
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда
		МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный");
		МодульОбсужденияСлужебный.ПриСозданииНаСервереПользователя(Отказ, ЭтотОбъект, Объект);
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(АдресФотографии) Тогда
		АдресФотографии = ПоместитьВоВременноеХранилище(БиблиотекаКартинок.ПользовательБезФотографии, УникальныйИдентификатор);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	#Если ВебКлиент Тогда
	Элементы.ПользовательИБПользовательОС.КнопкаВыбора = Ложь;
	#КонецЕсли
	
	ОбновитьСвойствоПоказыватьВСпискеВыбора();
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		Если МодульУправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
			ОбновитьЭлементыДополнительныхРеквизитов();
			МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
		КонецЕсли;
	КонецЕсли;
	
	Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") Тогда
		Если ВРег(Источник) = ВРег("ИспользоватьВнешнихПользователей") Тогда
			ПодключитьОбработчикОжидания("ПриИзмененияИспользованияВнешнихПользователей", 0.1, Истина);
		КонецЕсли;
		Если ВРег(Источник) = ВРег("НастройкиВходаПользователей") Тогда
			ПодключитьОбработчикОжидания("ПриИзмененияНастроекВходаПользователей", 0.1, Истина);
		КонецЕсли;
	КонецЕсли;
	
	Если ВРег(ИмяСобытия) = ВРег("Запись_ГруппыДоступа") Тогда
		ПодключитьОбработчикОжидания("ПриИзмененияГруппыДоступа", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект, "КонтактнаяИнформация");
		
		Если ТипЗнч(УровеньДоступа) = Тип("Структура") И ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда
			ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля(
				ЭтотОбъект,
				ПользовательИБАдресЭлектроннойПочты,
				ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, ТекущийОбъект));
		КонецЕсли;
		
	КонецЕсли;
	
	НастроитьФорму(ТекущийОбъект);
	
	// СтандартныеПодсистемы.УправлениеДоступом
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.УправлениеДоступом

	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
		МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

	Фотография = ТекущийОбъект.Фотография.Получить();
	Если Фотография <> Неопределено Тогда
		АдресФотографии = ПоместитьВоВременноеХранилище(Фотография, УникальныйИдентификатор);
		ФотографияЗадана = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	
	ОчиститьСообщения();
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля)
			И ПользовательИБАдресЭлектроннойПочты <> ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] Тогда
			Если ПарольДляПодтвержденияИзмененияПочты = Неопределено Тогда
				Отказ = Истина;
				ДополнительныеПараметры = Новый Структура("ПараметрыЗаписи", ПараметрыЗаписи);
				Оповещение = Новый ОписаниеОповещения("ПослеЗапросаПароляДляИзмененияПочты", ЭтотОбъект, ДополнительныеПараметры);
				ОткрытьФорму("Справочник.Пользователи.Форма.ВводПароля",, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ЗаголовокВопросов = НСтр("ru = 'Запись пользователя информационной базы'");
	
	// Копирование прав пользователя.
	Если ЗначениеЗаполнено(ЗначениеКопирования)
	   И Не ЗначениеЗаполнено(Объект.Ссылка)
	   И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом")
	   И (Не ПараметрыЗаписи.Свойство("НеКопироватьПраваПользователя")
	      И Не ПараметрыЗаписи.Свойство("КопироватьПраваПользователя")) Тогда
		
		Отказ = Истина;
		ПоказатьВопрос(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросОКопированииПрав", ЭтотОбъект, ПараметрыЗаписи),
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Скопировать также права пользователя ""%1""?'"), Строка(ЗначениеКопирования)),
			РежимДиалогаВопрос.ДаНет,
			,
			,
			ЗаголовокВопросов);
		Возврат;
	КонецЕсли;
	
	Если Не ПараметрыЗаписи.Свойство("СПустымСпискомРолей")
	   И ВходВПрограммуРазрешен
	   И ДействияВФорме.Роли = "Редактирование"
	   И ПользовательИБРоли.Количество() = 0 Тогда
	
		Отказ = Истина;
		ПоказатьВопрос(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросОЗаписиСПустымСпискомРолей", ЭтотОбъект, ПараметрыЗаписи),
			НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"),
			РежимДиалогаВопрос.ДаНет,
			,
			,
			ЗаголовокВопросов);
		Возврат;
	КонецЕсли;
	
	Если Не ПараметрыЗаписи.Свойство("ССозданиемПервогоАдминистратора")
	   И ЗначениеЗаполнено(ПользовательИБИмя)
	   И СписокПользователейИБПустой() Тогда
		
		Отказ = Истина;
		ПараметрыЗаписиПриПроверкеПервогоАдминистратора = ПараметрыЗаписи;
		ПодключитьОбработчикОжидания("ПроверитьПервогоАдминистратора", 0.1, Истина);
		Возврат;
	КонецЕсли;
	
	// Запрос пароля должен быть последним, чтобы работала попытка / исключение.
	Если ОбщегоНазначенияКлиент.РазделениеВключено()
		И ТребуетсяСинхронизацияССервисом
		И Не ПараметрыЗаписи.Свойство("ПослеЗапросаПароляДляАутентификацииВСервисе") Тогда
		
		ПараметрыЗаписи.Вставить("ПослеЗапросаПароляДляАутентификацииВСервисе");
		Отказ = Истина;
		ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе(
			Новый ОписаниеОповещения("ПослеЗапросаПароляДляАутентификацииВСервисеПередЗаписью", ЭтотОбъект, ПараметрыЗаписи),
			ЭтотОбъект,
			ПарольПользователяСервиса);
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	ТекущийОбъект.ДополнительныеСвойства.Вставить("ЗначениеКопирования", ЗначениеКопирования);
	
	ТекущийОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", ПарольПользователяСервиса);
	ТекущийОбъект.ДополнительныеСвойства.Вставить("СинхронизироватьССервисом", ТребуетсяСинхронизацияССервисом);
	
	Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда
		
		Если ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда
			
			Если ПользовательИБЗапрещеноИзменятьПароль Тогда
				ПользовательИБЗапрещеноВосстанавливатьПароль = Истина;
			КонецЕсли;
			
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
				
				Если ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект) Тогда
					
					Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля)
						И ПользовательИБАдресЭлектроннойПочты <> ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] Тогда
						
						Если ЗначениеЗаполнено(ТекущийОбъект.Ссылка) Тогда
							Подготовлен = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийОбъект.Ссылка, "Подготовлен");
						Иначе
							Подготовлен = УровеньДоступа.УправлениеСписком;
						КонецЕсли;
						
						ИзменятьПочтуБезПодтвержденияПаролем = Пользователи.ЭтоПолноправныйПользователь() Или Подготовлен;
						
						Если Не ИзменятьПочтуБезПодтвержденияПаролем Тогда
							
							ПарольСовпадаетССохраненным = Ложь;
							
							Если ТипЗнч(ПарольДляПодтвержденияИзмененияПочты) = Тип("Строка") Тогда
								УстановитьПривилегированныйРежим(Истина);
								ПарольСовпадаетССохраненным = ПользователиСлужебный.СтарыйПарольСовпадаетССохраненным(
									ПарольДляПодтвержденияИзмененияПочты, Объект.ИдентификаторПользователяИБ);
								УстановитьПривилегированныйРежим(Ложь);
							КонецЕсли;
							
							// проверка пароля
							Если Не ПарольСовпадаетССохраненным Тогда
								ПарольДляПодтвержденияИзмененияПочты = Неопределено;
								ВызватьИсключение НСтр("ru = 'Пароль указан неверно'");
							КонецЕсли;
							
						КонецЕсли;
						
						ПользовательИБАдресЭлектроннойПочты = ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля];
						
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		ОписаниеПользователяИБ = ОписаниеПользователяИБ();
		
		Если ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ) Тогда
			ОписаниеПользователяИБ.Вставить("УникальныйИдентификатор", Объект.ИдентификаторПользователяИБ);
		КонецЕсли;
		ОписаниеПользователяИБ.Вставить("Действие", "Записать");
		
		ТекущийОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
		
		Если ПараметрыЗаписи.Свойство("ССозданиемПервогоАдминистратора") Тогда
			ТекущийОбъект.ДополнительныеСвойства.Вставить("СозданиеАдминистратора",
				НСтр("ru = 'Первый пользователь информационной базы назначается администратором.'"));
		КонецЕсли;
	КонецЕсли;
	
	Если ДействияВФорме.СвойстваЭлемента <> "Редактирование" Тогда
		ЗаполнитьЗначенияСвойств(ТекущийОбъект, ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
			ТекущийОбъект.Ссылка, "Наименование, ПометкаУдаления"));
	КонецЕсли;
	
	РегистрыСведений.СведенияОПользователях.УстановитьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект);
	
	ТекущийОбъект.ДополнительныеСвойства.Вставить("ГруппаНовогоПользователя", ГруппаНовогоПользователя);
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		Если НЕ Отказ И ДействияВФорме.КонтактнаяИнформация = "Редактирование" Тогда
			МодульУправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
		КонецЕсли;
	КонецЕсли;
	
	Если ФотографияЗадана И ЭтоАдресВременногоХранилища(АдресФотографии) Тогда
		ТекущийОбъект.Фотография = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресФотографии));
	Иначе 
		ТекущийОбъект.Фотография = Новый ХранилищеЗначения(Неопределено);
	КонецЕсли;
		
КонецПроцедуры

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	Если ПараметрыЗаписи.Свойство("КопироватьПраваПользователя") Тогда
		Источник = ЗначениеКопирования;
		Приемник = ТекущийОбъект.Ссылка;
		МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
		МодульУправлениеДоступомСлужебный.ПриКопированииПравНовомуПользователю(Источник, Приемник);
		ПользователиСлужебный.СкопироватьГруппыПользователя(Источник, Приемник);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	
	ТребуетсяСинхронизацияССервисом = Ложь;
	
	Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда
		ПараметрыЗаписи.Вставить(
			ТекущийОбъект.ДополнительныеСвойства.ОписаниеПользователяИБ.РезультатДействия);
	КонецЕсли;
	
	Если ПараметрыЗаписи.Свойство("ССозданиемПервогоАдминистратора") Тогда
		ПользователиСлужебный.СкопироватьНастройкиПользователя("", ПользовательИБИмя);
	КонецЕсли;
	
	НастроитьФорму(ТекущийОбъект, , ПараметрыЗаписи);
	
	ОбновитьСпособИзмененияEMailВСервисе();
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда
		МодульОбсуждения = ОбщегоНазначения.ОбщийМодуль("Обсуждения");
		МодульОбсуждения.ОбновитьПользователяВСистемеВзаимодействия(ТекущийОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	Оповестить("Запись_Пользователи", Новый Структура, Объект.Ссылка);
	
	Если ПараметрыЗаписи.Свойство("ДобавленПользовательИБ") Тогда
		Оповестить("ДобавленПользовательИБ", ПараметрыЗаписи.ДобавленПользовательИБ, ЭтотОбъект);
		
	ИначеЕсли ПараметрыЗаписи.Свойство("ИзмененПользовательИБ") Тогда
		Оповестить("ИзмененПользовательИБ", ПараметрыЗаписи.ИзмененПользовательИБ, ЭтотОбъект);
		
	ИначеЕсли ПараметрыЗаписи.Свойство("УдаленПользовательИБ") Тогда
		Оповестить("УдаленПользовательИБ", ПараметрыЗаписи.УдаленПользовательИБ, ЭтотОбъект);
		
	ИначеЕсли ПараметрыЗаписи.Свойство("ОчищеноСопоставлениеСНесуществующимПользователемИБ") Тогда
		Оповестить(
			"ОчищеноСопоставлениеСНесуществующимПользователемИБ",
			ПараметрыЗаписи.ОчищеноСопоставлениеСНесуществующимПользователемИБ,
			ЭтотОбъект);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ГруппаНовогоПользователя) Тогда
		ОповеститьОбИзменении(ГруппаНовогоПользователя);
		Оповестить("Запись_ГруппыПользователей", Новый Структура, ГруппаНовогоПользователя);
		ГруппаНовогоПользователя = Неопределено;
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда
		ОписаниеЗавершения = Новый ОписаниеОповещения("ПослеЗаписиЗавершение", ЭтотОбъект, ПараметрыЗаписи);
		МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент");
		МодульОбсужденияСлужебныйКлиент.ПослеЗаписиПользователя(ЭтотОбъект, ОписаниеЗавершения);
		Возврат;
	КонецЕсли;
	
	ПарольДляПодтвержденияИзмененияПочты = Неопределено;
	
	ПослеЗаписиЗавершение(Неопределено, ПараметрыЗаписи);
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда
		ОписаниеПользователяИБ = ОписаниеПользователяИБ();
		ОписаниеПользователяИБ.Вставить("ИдентификаторПользователяИБ", Объект.ИдентификаторПользователяИБ);
		
		Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) Тогда
			ОписаниеПользователяИБ.АдресЭлектроннойПочты = ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля];
		КонецЕсли;
		
		ПользователиСлужебный.ПроверитьОписаниеПользователяИБ(ОписаниеПользователяИБ, Отказ, Ложь);
		
	КонецЕсли;
	
	Если ВходВПрограммуРазрешен
	   И ЗначениеЗаполнено(СрокДействия)
	   И СрокДействия <= НачалоДня(ТекущаяДатаСеанса()) Тогда
		
		ОбщегоНазначения.СообщитьПользователю(
			НСтр("ru = 'Ограничение должно быть до завтра или более.'"),, "ВходВПрограммуРазрешен",, Отказ);
	КонецЕсли;
	
	// Проверка наличия ролей в метаданных.
	Если Не Элементы.Роли.ТолькоПросмотр Тогда
		Ошибки = Неопределено;
		ЭлементыДерева = Роли.ПолучитьЭлементы();
		Для Каждого Строка Из ЭлементыДерева Цикл
			Если Не Строка.Пометка Тогда
				Продолжить;
			КонецЕсли;
			Если Строка.ЭтоНесуществующаяРоль Тогда
				ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,
					"Роли[%1].РолиСиноним",
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Несуществующая роль ""%1"".'"), Строка.Синоним),
					"Роли",
					ЭлементыДерева.Индекс(Строка),
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Несуществующая роль ""%1"" в строке %2.'"), Строка.Синоним, "%1"));
			КонецЕсли;
			Если Строка.ЭтоНедоступнаяРоль Тогда
				ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,
					"Роли[%1].РолиСиноним",
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Роль ""%1"" недоступна для пользователей.'"), Строка.Синоним),
					"Роли",
					ЭлементыДерева.Индекс(Строка),
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Роль ""%1"" в строке %2 недоступна для пользователей.'"), Строка.Синоним, "%1"));
			КонецЕсли;
		КонецЦикла;
		ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ);
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		МодульУправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтотОбъект, Объект, Отказ);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриЗагрузкеНастроек", Настройки);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ЗаполнитьИзПользователяИБ(Команда)
	
	Если УровеньДоступа.УправлениеСписком
	   И ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
		
		Если ПриЧтенииВходВПрограммуРазрешен И Объект.Недействителен Тогда
			Объект.Недействителен = Ложь;
			НедействителенПриИзменении(Элементы.Недействителен);
		КонецЕсли;
	КонецЕсли;
	
	ЗаполнитьПоляПоПользователюИБНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
	
	ОбновитьИмяДляВхода(ЭтотОбъект, Истина);
	
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура НедействителенПриИзменении(Элемент)
	
	Если РазделениеВключено
	   И Не Объект.Недействителен Тогда
		ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Истина;
	КонецЕсли;
	
	Если Объект.Недействителен Тогда
		ВходВПрограммуРазрешен = Ложь;
		Если Не ПользовательИБАутентификацияOpenID
		   И Не ПользовательИБАутентификацияOpenIDConnect
		   И Не ПользовательИБАутентификацияТокеномДоступа
		   И Не ПользовательИБАутентификацияОС
		   И Не ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения
		   И ПользовательИБАутентификацияСтандартная Тогда
			
			ПользовательИБАутентификацияСтандартная = Ложь;
		КонецЕсли;
	ИначеЕсли ВходВПрограммуРазрешенЗначениеПрямогоИзменения Тогда
		Если Не ПользовательИБАутентификацияСтандартная
		   И Не ПользовательИБАутентификацияOpenID
		   И Не ПользовательИБАутентификацияOpenIDConnect
		   И Не ПользовательИБАутентификацияТокеномДоступа
		   И Не ПользовательИБАутентификацияОС Тогда
			ПользовательИБАутентификацияСтандартная = Истина;
		КонецЕсли;
		ВходВПрограммуРазрешен = Истина;
	КонецЕсли;
	
	ОбновитьСвойствоПоказыватьВСпискеВыбора();
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВходВПрограммуРазрешенПриИзменении(Элемент)
	
	Если РазделениеВключено
	   И Не ВходВПрограммуРазрешен Тогда
		
		ВходВПрограммуРазрешен = Истина;
		Объект.Недействителен = Истина;
		НедействителенПриИзменении(Элементы.Недействителен);
		Возврат;
	КонецЕсли;
	
	Если Объект.ПометкаУдаления И ВходВПрограммуРазрешен Тогда
		ВходВПрограммуРазрешен = Ложь;
		ПоказатьПредупреждение(,
			НСтр("ru = 'Чтобы разрешить вход в программу, снимите
			           |пометку на удаление с этого пользователя.'"));
		Возврат;
	КонецЕсли;
	
	Если Не ВходВПрограммуРазрешен
	   И Не ПользовательИБАутентификацияOpenID
	   И Не ПользовательИБАутентификацияOpenIDConnect
	   И Не ПользовательИБАутентификацияТокеномДоступа
	   И Не ПользовательИБАутентификацияОС
	   И Не ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения
	   И ПользовательИБАутентификацияСтандартная Тогда
		
		ПользовательИБАутентификацияСтандартная = Ложь;
	КонецЕсли;
	
	ОбновитьИмяДляВхода(ЭтотОбъект);
	
	Если ВходВПрограммуРазрешен
	   И Не ПользовательИБАутентификацияOpenID
	   И Не ПользовательИБАутентификацияOpenIDConnect
	   И Не ПользовательИБАутентификацияТокеномДоступа
	   И Не ПользовательИБАутентификацияОС
	   И Не ПользовательИБАутентификацияСтандартная Тогда
	
		ПользовательИБАутентификацияСтандартная = Истина;
	КонецЕсли;
	
	ОбновитьСвойствоПоказыватьВСпискеВыбора();
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
	Если Не УровеньДоступа.ИзменениеРазрешенияНаВход
	   И Не ВходВПрограммуРазрешен Тогда
		
		ПоказатьПредупреждение(,
			НСтр("ru = 'После записи вход в программу сможет разрешить только администратор.'"));
	КонецЕсли;
	
	ВходВПрограммуРазрешенЗначениеПрямогоИзменения = ВходВПрограммуРазрешен;
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьОграничениеНаВходВПрограмму(Команда)
	
	ОткрытьФорму("Справочник.Пользователи.Форма.ОграничениеНаВходВПрограмму",, ЭтотОбъект,,,,
		Новый ОписаниеОповещения("ИзменитьОграничениеНаВходВПрограммуЗавершение", ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБИмяПриИзменении(Элемент)
	
	ПользовательИБИмя = СокрЛП(ПользовательИБИмя);
	ПользовательИБИмяЗначениеПрямогоИзменения = ПользовательИБИмя;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияСтандартнаяПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения = ПользовательИБАутентификацияСтандартная;
	
КонецПроцедуры

&НаКлиенте
Процедура ПотребоватьСменуПароляПриВходеПриИзменении(Элемент)
	
	Если ПотребоватьСменуПароляПриВходе Тогда
		ПользовательИБЗапрещеноИзменятьПароль = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБПоказыватьВСпискеВыбораПриИзменении(Элемент)
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБЗапрещеноИзменятьПарольПриИзменении(Элемент)
	
	Если ПользовательИБЗапрещеноИзменятьПароль Тогда
		ПотребоватьСменуПароляПриВходе               = Ложь;
		ПользовательИБЗапрещеноВосстанавливатьПароль = Истина;
	КонецЕсли;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияOpenIDПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияOpenIDConnectПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияТокеномДоступаПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияОСПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБПользовательОСПриИзменении(Элемент)
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБПользовательОСНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
		ОткрытьФорму("Справочник.Пользователи.Форма.ВыборПользователяОперационнойСистемы", , Элемент);
	#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБЯзыкПриИзменении(Элемент)
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБРежимЗапускаПриИзменении(Элемент)
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБРежимЗапускаОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства")
		И ТекущаяСтраница.Имя = "СтраницаДополнительныеРеквизиты"
		И Не ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
		
		СвойстваВыполнитьОтложеннуюИнициализацию();
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПотребоватьСменуПароляПриВходеРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ОткрытьФорму("ОбщаяФорма.НастройкиВходаПользователей", , ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ФотографияНажатие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ОповещениеОЗавершение = Новый ОписаниеОповещения("ФотографияНажатиеЗавершение", ЭтотОбъект);
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
	ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Изображения'") + "|*.JPG;*.JPEG;*.JP2;*.JPG2;*.PNG;*.BMP;*.TIFF";
	ФайловаяСистемаКлиент.ЗагрузитьФайл(ОповещениеОЗавершение, ПараметрыЗагрузки);
КонецПроцедуры

&НаКлиенте
Процедура ФотографияНажатиеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	#Если Не ВебКлиент Тогда
		Картинка = Новый Картинка(ПолучитьИзВременногоХранилища(Результат.Хранение));
		Если Картинка.Формат() = ФорматКартинки.НеизвестныйФормат Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Необходимо выбрать файл с изображением.'"));
			Возврат;
		КонецЕсли;
		
		Если Картинка.РазмерФайла() > 2 * 1024 * 1024 Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Необходимо выбрать файл с изображением меньше 2 Мб.'"));
			Возврат;
		КонецЕсли;
	#КонецЕсли
	
	Если ЭтоАдресВременногоХранилища(АдресФотографии) Тогда
		УдалитьИзВременногоХранилища(АдресФотографии);
	КонецЕсли;
	
	АдресФотографии = Результат.Хранение;
	Модифицированность = Истина;
	ФотографияЗадана = Истина;
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Поддержка контактной информации.

&НаКлиенте
Процедура Подключаемый_EMailПриИзменении(Элемент)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
		
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьИзменение(ЭтотОбъект, Элемент);
	
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
	Если НЕ Объект.Ссылка.Пустая() Тогда
		Возврат;
	КонецЕсли;
	
	ТаблицаКИ = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
	
	СтрокаEMail = ТаблицаКИ.НайтиСтроки(Новый Структура("Вид",
		ВидКонтактнойИнформацииEmailПользователя()))[0];
	
	Если ЗначениеЗаполнено(ЭтотОбъект[СтрокаEMail.ИмяРеквизита]) Тогда
		ПользовательИБПароль = "" + Новый УникальныйИдентификатор + "qQ";
		УстановитьНаличиеПароля(ЭтотОбъект, Истина, ПользователиКлиент.АвторизованныйПользователь());
	КонецЕсли;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

// Подключаемый обработчик очистки.
//
// Параметры:
//  Элемент - ПолеФормы
//  СтандартнаяОбработка - Булево
//
&НаКлиенте
Процедура Подключаемый_EMailОчистка(Элемент, СтандартнаяОбработка)
	
	Если Не Элемент.РедактированиеТекста Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьОчистку(ЭтотОбъект, Элемент.Имя);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ТелефонПриИзменении(Элемент)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьИзменение(ЭтотОбъект, Элемент);
	
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_EMailНачалоВыбора(Элемент)
	
	Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
		Возврат;
	КонецЕсли;
	
	ТаблицаКИ = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
	
	Отбор = Новый Структура("Вид", ВидКонтактнойИнформацииEmailПользователя());
	
	СтрокаEMail = ТаблицаКИ.НайтиСтроки(Отбор)[0];
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("СтараяПочта",  ЭтотОбъект[СтрокаEMail.ИмяРеквизита]);
	
	ОткрытьФорму("Справочник.Пользователи.Форма.СменаПочты", ПараметрыФормы, ЭтотОбъект,,,,
		Новый ОписаниеОповещения("ПослеВыбораНовойПочты", ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьИзменение(ЭтотОбъект, Элемент);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент,, СтандартнаяОбработка);
	
КонецПроцедуры

// Подключаемый обработчик нажатия.
//
// Параметры:
//  Элемент - ДекорацияФормы
//          - РасширениеДекорацииФормыДляНадписи
//  СтандартнаяОбработка - Булево
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияПриНажатии(Элемент, СтандартнаяОбработка)
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент,, СтандартнаяОбработка);
КонецПроцедуры

// Подключаемый обработчик очистки.
//
// Параметры:
//  Элемент - ПолеФормы
//  СтандартнаяОбработка - Булево
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияОчистка(Элемент, СтандартнаяОбработка)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьОчистку(ЭтотОбъект, Элемент.Имя);
	
КонецПроцедуры

// Подключаемый обработчик команды.
// 
// Параметры:
//  Команда - КомандаФормы
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияВыполнитьКоманду(Команда)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда.Имя);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.АвтоПодборАдреса(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка);
	
КонецПроцедуры

// Подключаемый обработчик выбора.
//
// Параметры:
//  Элемент - ПолеФормы
//  ВыбранноеЗначение - Строка
//  СтандартнаяОбработка - Булево
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.ОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, Элемент.Имя, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьОбновлениеКонтактнойИнформации(Результат, ДополнительныеПараметры) Экспорт
	ОбновитьКонтактнуюИнформацию(Результат);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыРоли

////////////////////////////////////////////////////////////////////////////////
// Для работы интерфейса ролей.

&НаКлиенте
Процедура РолиПометкаПриИзменении(Элемент)
	
	СтрокаТаблицы = Элементы.Роли.ТекущиеДанные;
	Если СтрокаТаблицы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если СтрокаТаблицы.Пометка И СтрокаТаблицы.Имя = "ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок" Тогда
		Оповещение = Новый ОписаниеОповещения("РолиПометкаПриИзмененииПослеПодтверждения", ЭтотОбъект);
		ПараметрыФормы = Новый Структура("Ключ", "ПередВыборомРоли");
		ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение);
	Иначе
		Если СтрокаТаблицы.Имя = "ПолныеПрава" Тогда
			УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
		КонецЕсли;
		ОбработатьИнтерфейсРолей("ОбновитьСоставРолей");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура РолиПометкаПриИзмененииПослеПодтверждения(Ответ, ПараметрыВыполнения) Экспорт
	СтрокаТаблицы = Элементы.Роли.ТекущиеДанные;
	Если СтрокаТаблицы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если Ответ = "Продолжить" Тогда
		ОбработатьИнтерфейсРолей("ОбновитьСоставРолей");
	Иначе
		СтрокаТаблицы.Пометка = Ложь;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
	
	Записать(Новый Структура("ЗаписатьИЗакрыть"));
	
КонецПроцедуры

&НаКлиенте
Процедура СменитьПароль(Команда)
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ВернутьПарольБезУстановки", Истина);
	ДополнительныеПараметры.Вставить("СтарыйПароль", ПользовательИБСтарыйПароль);
	ДополнительныеПараметры.Вставить("ИмяДляВхода",  ПользовательИБИмя);
	
	ПользователиСлужебныйКлиент.ОткрытьФормуСменыПароля(Объект.Ссылка, Новый ОписаниеОповещения(
		"СменитьПарольПослеПолученияПароля", ЭтотОбъект), ДополнительныеПараметры);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьФотографию(Команда)
	ФотографияНажатие(Элементы.Фотография, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьФотографию(Команда)
	АдресФотографии = ПоместитьВоВременноеХранилище(БиблиотекаКартинок.ПользовательБезФотографии, УникальныйИдентификатор);
	ФотографияЗадана = Ложь;
	Модифицированность = Истина;
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Для работы интерфейса ролей.

&НаКлиенте
Процедура ПоказатьТолькоВыбранныеРоли(Команда)
	
	ОбработатьИнтерфейсРолей("ТолькоВыбранныеРоли");
	ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппировкаРолейПоПодсистемам(Команда)
	
	ОбработатьИнтерфейсРолей("ГруппировкаПоПодсистемам");
	ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьРоли(Команда)
	
	ОбработатьИнтерфейсРолей("ОбновитьСоставРолей", "ВключитьВсе");
	ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ИсключитьРоли(Команда)
	
	ОбработатьИнтерфейсРолей("ОбновитьСоставРолей", "ИсключитьВсе");
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.РолиПометка.Имя);

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Роли.Имя");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Метаданные.Роли.ПолныеПрава.Имя;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЗапретИзмененияАдминистративногоДоступа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.РолиПометка.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.РолиСиноним.Имя);

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Роли.Имя");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Метаданные.Роли.ПолныеПрава.Имя;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЗапретИзмененияАдминистративногоДоступа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);

КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененияИспользованияВнешнихПользователей()
	
	ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора();
	ОбновитьСвойствоПоказыватьВСпискеВыбора();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененияНастроекВходаПользователей()
	
	ПриИзмененияНастроекВходаПользователейНаСервере();
	ОбновитьСвойствоПоказыватьВСпискеВыбора();
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененияНастроекВходаПользователейНаСервере()
	
	ОбщаяНастройкаПоказыватьВСпискеВыбора =
		ПользователиСлужебный.НастройкиВхода().Общие.ПоказыватьВСпискеВыбора;
	
	ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора()
	
	Если ОбщегоНазначения.РазделениеВключено()
	 Или ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда
		
		Элементы.ПользовательИБПоказыватьВСпискеВыбора.Видимость = Ложь;
		Возврат;
	КонецЕсли;
	
	Элементы.ПользовательИБПоказыватьВСпискеВыбора.Видимость =
		    ОбщаяНастройкаПоказыватьВСпискеВыбора = "ВключеноДляНовыхПользователей"
		Или ОбщаяНастройкаПоказыватьВСпискеВыбора = "ВыключеноДляНовыхПользователей"
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененияГруппыДоступа()
	
	ПриИзмененияГруппыДоступаНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененияГруппыДоступаНаСервере()
	
	УстановитьПривилегированныйРежим(Истина);
	НаличиеПрав = РегистрыСведений.СведенияОПользователях.НаличиеПрав(Объект.ИдентификаторПользователяИБ);
	УстановитьПривилегированныйРежим(Ложь);
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Процедура НастроитьФорму(ТекущийОбъект, ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено)
	
	Если НачальноеОписаниеПользователяИБ = Неопределено Тогда
		Возврат; // Вызов ПриЧтенииНаСервере до вызова ПриСозданииНаСервере.
	КонецЕсли;
	
	Если Не ПриСозданииНаСервере Тогда
		ПрочитатьПользователяИБ();
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	РегистрыСведений.СведенияОПользователях.ПрочитатьСведенияОПользователе(ЭтотОбъект);
	НаличиеПрав = РегистрыСведений.СведенияОПользователях.НаличиеПрав(Объект.ИдентификаторПользователяИБ);
	УстановитьПривилегированныйРежим(Ложь);
	
	УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ТекущийОбъект);
	
	ОпределитьДействияВФорме();
	
	ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи);
	
	ОбработатьИнтерфейсРолей("УстановитьТолькоПросмотрРолей",
		    ПользователиСлужебный.ЗапретРедактированияРолей()
		Или ДействияВФорме.Роли <> "Редактирование"
		Или Не УровеньДоступа.НастройкиДляВхода);
	
	Если ОбщегоНазначения.РазделениеВключено()
	   И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда
		
		МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса");
		ДействияСПользователемСервиса = МодульПользователиСлужебныйВМоделиСервиса.ПолучитьДействияСПользователемСервиса(
			ТекущийОбъект.Ссылка);
	КонецЕсли;
	
	// Настройка возможности просмотра.
	Элементы.КонтактнаяИнформация.Видимость   = ЗначениеЗаполнено(ДействияВФорме.КонтактнаяИнформация);
	Элементы.СвойстваПользователяИБ.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ);
	Элементы.ГруппаИмя.Видимость              = ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ);
	
	ВыводитьСписокРолей = ЗначениеЗаполнено(ДействияВФорме.Роли);
	Элементы.ОтображениеРолей.Видимость = ВыводитьСписокРолей;
	
	Элементы.РекомендуетсяПроверитьНастройкиДляВхода.Видимость =
		  УровеньДоступа.ИзменениеРазрешенияНаВход
		И ТекущийОбъект.Подготовлен
		И Не ПриЧтенииВходВПрограммуРазрешен;
	
	// Настройка возможности изменения.
	Если ТекущийОбъект.Служебный Тогда
		ТолькоПросмотр = Истина;
	КонецЕсли;
	Элементы.ГруппаСлужебныйПользователь.Видимость = ТекущийОбъект.Служебный;
	
	ТолькоПросмотр = ТолькоПросмотр
		ИЛИ ДействияВФорме.Роли                   <> "Редактирование"
		  И ДействияВФорме.СвойстваЭлемента       <> "Редактирование"
		  И ДействияВФорме.КонтактнаяИнформация   <> "Редактирование"
		  И ДействияВФорме.СвойстваПользователяИБ <> "Редактирование";
	
	ДоступностьКнопки = Не ТолькоПросмотр И ПравоДоступа("Редактирование",
		Метаданные.Справочники.Пользователи);
	
	Если Элементы.ФормаЗаписатьИЗакрыть.Доступность <> ДоступностьКнопки Тогда
		Элементы.ФормаЗаписатьИЗакрыть.Доступность = ДоступностьКнопки;
	КонецЕсли;
	
	Если Элементы.ИзменитьОграничениеНаВходВПрограмму.Доступность <> ДоступностьКнопки Тогда
		Элементы.ИзменитьОграничениеНаВходВПрограмму.Доступность = ДоступностьКнопки;
	КонецЕсли;
	
	Если Элементы.СменитьПароль.Доступность <> ДоступностьКнопки Тогда
		Элементы.СменитьПароль.Доступность = ДоступностьКнопки;
	КонецЕсли;
	
	Элементы.Наименование.ТолькоПросмотр =
		Не (ДействияВФорме.СвойстваЭлемента = "Редактирование" И УровеньДоступа.УправлениеСписком);
	
	Элементы.Недействителен.ТолькоПросмотр = Элементы.Наименование.ТолькоПросмотр;
	Элементы.ФизическоеЛицо.ТолькоПросмотр = Элементы.Наименование.ТолькоПросмотр;
	Элементы.Подразделение.ТолькоПросмотр  = Элементы.Наименование.ТолькоПросмотр;
	
	Элементы.СвойстваПользователяИБ.ТолькоПросмотр =
		Не (  ДействияВФорме.СвойстваПользователяИБ = "Редактирование"
		    И (УровеньДоступа.УправлениеСписком Или УровеньДоступа.ИзменениеТекущего));
	Элементы.ГруппаИмя.ТолькоПросмотр = Элементы.СвойстваПользователяИБ.ТолькоПросмотр;
	
	Элементы.ПользовательИБИмя.ТолькоПросмотр                          = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияСтандартная.ТолькоПросмотр    = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияOpenID.ТолькоПросмотр         = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияOpenIDConnect.ТолькоПросмотр  = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияТокеномДоступа.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияОС.ТолькоПросмотр             = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБПользовательОС.ТолькоПросмотр               = Не УровеньДоступа.НастройкиДляВхода;
	
	Элементы.ПользовательИБПоказыватьВСпискеВыбора.ТолькоПросмотр        = Не УровеньДоступа.УправлениеСписком;
	Элементы.ПотребоватьСменуПароляПриВходе.ТолькоПросмотр               = Не УровеньДоступа.УправлениеСписком;
	Элементы.ПользовательИБЗапрещеноИзменятьПароль.ТолькоПросмотр        = Не УровеньДоступа.УправлениеСписком;
	Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком;
	Элементы.ПользовательИБРежимЗапуска.ТолькоПросмотр                   = Не УровеньДоступа.УправлениеСписком;
	
	Элементы.Комментарий.ТолькоПросмотр =
		Не (ДействияВФорме.СвойстваЭлемента = "Редактирование" И УровеньДоступа.УправлениеСписком);
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Процедура ПодготовитьНеобязательныйРеквизит(ИмяРеквизита, Используется)
	
	Если Не Используется Тогда
		Элементы[ИмяРеквизита].Видимость = Ложь;
	Иначе
		ТипыПодразделения = Метаданные.ОпределяемыеТипы[ИмяРеквизита].Тип.Типы();
		Если ТипыПодразделения.Количество() = 1 И ОбщегоНазначения.ЭтоСсылка(ТипыПодразделения[0]) Тогда
			ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипыПодразделения[0]);
			Элементы[ИмяРеквизита].Заголовок = ПредставлениеОбъекта(ОбъектМетаданных);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ПредставлениеОбъекта(ОбъектМетаданных)
	
	Если ЗначениеЗаполнено(ОбъектМетаданных.ПредставлениеОбъекта) Тогда
		Возврат ОбъектМетаданных.ПредставлениеОбъекта;
	КонецЕсли;
	
	Возврат ОбъектМетаданных.Представление();
	
КонецФункции

// Продолжение обработчика события ПередЗаписью.
&НаКлиенте
Процедура ПослеЗапросаПароляДляАутентификацииВСервисеПередЗаписью(НовыйПарольПользователяСервиса, ПараметрыЗаписи) Экспорт
	
	Если НовыйПарольПользователяСервиса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПарольПользователяСервиса = НовыйПарольПользователяСервиса;
	
	Попытка
		Записать(ПараметрыЗаписи);
	Исключение
		ПарольПользователяСервиса = Неопределено;
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

// Продолжение обработчика события ПередЗаписью.
&НаКлиенте
Процедура ПослеЗапросаПароляДляИзмененияПочты(Результат, ДополнительныеПараметры) Экспорт
	
	Если ТипЗнч(Результат) = Тип("Строка") Тогда
		ПарольДляПодтвержденияИзмененияПочты = Результат;
		Записать(ДополнительныеПараметры.ПараметрыЗаписи);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьИмяДляВхода(Форма, ПриИзмененииНаименования = Ложь)
	
	Элементы = Форма.Элементы;
	
	// Настройка необходимости заполнения.
	ПоказатьИмяСОтметкойНезаполненного = ТребуетсяЗаписьПользователяИБ(Форма, Ложь);
	Элементы.ПользовательИБИмя.АвтоОтметкаНезаполненного = ПоказатьИмяСОтметкойНезаполненного;
	Если Не ПоказатьИмяСОтметкойНезаполненного Тогда
		Элементы.ПользовательИБИмя.ОтметкаНезаполненного = Ложь;
	КонецЕсли;
	
	Если Форма.ПользовательИБСуществует Тогда
		Возврат;
	КонецЕсли;
	
	КраткоеИмя = ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(Форма.Объект.Наименование);
	
	Если Не ПоказатьИмяСОтметкойНезаполненного Тогда
		Если (Не ЗначениеЗаполнено(Форма.ПользовательИБИмяЗначениеПрямогоИзменения)
		      Или Форма.ПользовательИБИмяЗначениеПрямогоИзменения = КраткоеИмя)
		   И Форма.ПользовательИБИмя = КраткоеИмя Тогда
			
			Форма.ПользовательИБИмя = "";
		КонецЕсли;
	Иначе
		Если ПриИзмененииНаименования
		 Или Не ЗначениеЗаполнено(Форма.ПользовательИБИмя) Тогда
			
			Форма.ПользовательИБИмя = КраткоеИмя;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура АутентификацияПриИзменении()
	
	Если Не ПользовательИБАутентификацияСтандартная
	   И Не ПользовательИБАутентификацияOpenID
	   И Не ПользовательИБАутентификацияOpenIDConnect
	   И Не ПользовательИБАутентификацияТокеномДоступа
	   И Не ПользовательИБАутентификацияОС Тогда
	
		ВходВПрограммуРазрешен                       = Ложь;
		ПользовательИБЗапрещеноВосстанавливатьПароль = Истина;
		
		Если РазделениеВключено Тогда
			Объект.Недействителен = Истина;
			НедействителенПриИзменении(Элементы.Недействителен);
			Возврат;
		КонецЕсли;
		
	ИначеЕсли Не ВходВПрограммуРазрешен Тогда
		ВходВПрограммуРазрешен = ВходВПрограммуРазрешенЗначениеПрямогоИзменения;
		
		Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля)
			И ЗначениеЗаполнено(ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]) Тогда
				ПользовательИБЗапрещеноВосстанавливатьПароль = Ложь;
		КонецЕсли;
		
	КонецЕсли;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСвойствоПоказыватьВСпискеВыбора()
	
	Если ОбщаяНастройкаПоказыватьВСпискеВыбора = "СкрытоИВключеноДляВсехПользователей" Тогда
		ПользовательИБПоказыватьВСпискеВыбора = ПользовательИБАутентификацияСтандартная;
		
	ИначеЕсли ОбщаяНастройкаПоказыватьВСпискеВыбора = "СкрытоИВыключеноДляВсехПользователей" Тогда
		ПользовательИБПоказыватьВСпискеВыбора = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораНовойПочты(НоваяПочта, Контекст) Экспорт
	
	Если Не ЗначениеЗаполнено(НоваяПочта) Тогда
		Возврат;
	КонецЕсли;
	
	ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе(
		Новый ОписаниеОповещения("СменитьПочтуПослеЗапросаПароляДляАутентификацииВСервисе", ЭтотОбъект, НоваяПочта),
		ЭтотОбъект,
		ПарольПользователяСервиса);
	
КонецПроцедуры

&НаКлиенте
Процедура СменитьПочтуПослеЗапросаПароляДляАутентификацииВСервисе(НовыйПарольПользователяСервиса, НоваяПочта) Экспорт
	
	Если НовыйПарольПользователяСервиса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПарольПользователяСервиса = НовыйПарольПользователяСервиса;
	
	Попытка
		СоздатьЗапросНаСменуПочты(НоваяПочта, Объект.Ссылка, ПарольПользователяСервиса);
	Исключение
		ПарольПользователяСервиса = Неопределено;
		ВызватьИсключение;
	КонецПопытки;
	
	ПоказатьПредупреждение(,
		НСтр("ru = 'На указанный адрес отправлено письмо с запросом на подтверждение.
		           |Почта будет изменена только после подтверждения запроса пользователем.'"));
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СоздатьЗапросНаСменуПочты(Знач НоваяПочта, Знач Пользователь, Знач ПарольПользователяСервиса)
	
	ИнтеграцияПодсистемБСП.ПриСозданииЗапросаНаСменуПочты(НоваяПочта,
		Пользователь, ПарольПользователяСервиса);
	
КонецПроцедуры

// Продолжение процедуры СменитьПароль.
&НаКлиенте
Процедура СменитьПарольПослеПолученияПароля(Результат, Контекст) Экспорт
	
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Возврат;
	КонецЕсли;
	
	Модифицированность = Истина;
	
	ПользовательИБПароль       = Результат.НовыйПароль;
	ПользовательИБСтарыйПароль = Результат.СтарыйПароль;
	
	Если Результат.СтарыйПароль <> Неопределено Тогда
		ПарольПользователяСервиса = Результат.СтарыйПароль;
	КонецЕсли;
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
	УстановитьНаличиеПароля(ЭтотОбъект, ЗначениеЗаполнено(ПользовательИБПароль),
		ПользователиКлиент.АвторизованныйПользователь());
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьНаличиеПароля(Форма, ПарольУстановлен, АвторизованныйПользователь)
	
	ПользователиСлужебныйКлиентСервер.УстановитьНаличиеПароля(Форма, ПарольУстановлен, АвторизованныйПользователь);
	
КонецПроцедуры

&НаСервере
Процедура ОпределитьДействияВФорме()
	
	ДействияВФорме = Новый Структура;
	
	// "", "Просмотр", "Редактирование".
	ДействияВФорме.Вставить("Роли", "");
	
	// "", "Просмотр", "Редактирование".
	ДействияВФорме.Вставить("КонтактнаяИнформация", "Просмотр");
	
	// "", "ПросмотрВсех", "Редактирование".
	ДействияВФорме.Вставить("СвойстваПользователяИБ", "");
	
	// "", "Просмотр", "Редактирование".
	ДействияВФорме.Вставить("СвойстваЭлемента", "Просмотр");
	
	Если Не УровеньДоступа.АдминистраторСистемы
	   И УровеньДоступа.ПолныеПрава
	   И Пользователи.ЭтоПолноправныйПользователь(Объект.Ссылка, Истина) Тогда
		
		// Администратор системы доступен только на просмотр.
		ДействияВФорме.Роли                   = "Просмотр";
		ДействияВФорме.СвойстваПользователяИБ = "Просмотр";
	
	ИначеЕсли УровеньДоступа.АдминистраторСистемы
	      ИЛИ УровеньДоступа.ПолныеПрава Тогда
		
		ДействияВФорме.Роли                   = "Редактирование";
		ДействияВФорме.КонтактнаяИнформация   = "Редактирование";
		ДействияВФорме.СвойстваПользователяИБ = "Редактирование";
		ДействияВФорме.СвойстваЭлемента       = "Редактирование";
	Иначе
		Если УровеньДоступа.ИзменениеТекущего Тогда
			ДействияВФорме.СвойстваПользователяИБ = "Редактирование";
			ДействияВФорме.КонтактнаяИнформация   = "Редактирование";
		КонецЕсли;
		
		Если УровеньДоступа.УправлениеСписком Тогда
			// Ответственный за список пользователей и групп пользователей.
			// (Исполнитель распоряжений о приеме на работу и переводу,
			//  переназначению, созданию отделов, подразделений и рабочих групп).
			ДействияВФорме.СвойстваПользователяИБ = "Редактирование";
			ДействияВФорме.КонтактнаяИнформация   = "Редактирование";
			ДействияВФорме.СвойстваЭлемента       = "Редактирование";
			
			Если УровеньДоступа.НастройкиДляВхода Тогда
				ДействияВФорме.Роли = "Редактирование";
			КонецЕсли;
			Если Пользователи.ЭтоПолноправныйПользователь(Объект.Ссылка) Тогда
				ДействияВФорме.Роли = "Просмотр";
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ПользователиСлужебный.ПриОпределенииДействийВФорме(Объект.Ссылка, ДействияВФорме);
	
	// Проверка имен действий в форме.
	Если СтрНайти(", Просмотр, Редактирование,", ", " + ДействияВФорме.Роли + ",") = 0 Тогда
		ДействияВФорме.Роли = "";
		
	ИначеЕсли ДействияВФорме.Роли = "Редактирование"
	        И ПользователиСлужебный.ЗапретРедактированияРолей() Тогда
		
		ДействияВФорме.Роли = "Просмотр";
	КонецЕсли;
	
	Если СтрНайти(", Просмотр, Редактирование,", ", " + ДействияВФорме.КонтактнаяИнформация + ",") = 0 Тогда
		ДействияВФорме.КонтактнаяИнформация = "";
	КонецЕсли;
	
	Если СтрНайти(", Просмотр, ПросмотрВсех, Редактирование, РедактированиеСвоих, РедактированиеВсех,",
	           ", " + ДействияВФорме.СвойстваПользователяИБ + ",") = 0 Тогда
		
		ДействияВФорме.СвойстваПользователяИБ = "";
		
	Иначе // Поддержка обратной совместимости.
		Если СтрНайти(ДействияВФорме.СвойстваПользователяИБ, "Просмотр") Тогда
			ДействияВФорме.СвойстваПользователяИБ = "Просмотр";
			
		ИначеЕсли СтрНайти(ДействияВФорме.СвойстваПользователяИБ, "Редактирование") Тогда
			ДействияВФорме.СвойстваПользователяИБ = "Редактирование";
		КонецЕсли;
	КонецЕсли;
	
	Если СтрНайти(", Просмотр, Редактирование,", ", " + ДействияВФорме.СвойстваЭлемента + ",") = 0 Тогда
		ДействияВФорме.СвойстваЭлемента = "";
	КонецЕсли;
	
	Если Объект.Служебный Тогда
		Если ДействияВФорме.Роли = "Редактирование" Тогда
			ДействияВФорме.Роли = "Просмотр";
		КонецЕсли;
		
		Если ДействияВФорме.КонтактнаяИнформация = "Редактирование" Тогда
			ДействияВФорме.КонтактнаяИнформация = "Просмотр";
		КонецЕсли;
		
		Если ДействияВФорме.СвойстваПользователяИБ = "Редактирование" Тогда
			ДействияВФорме.СвойстваПользователяИБ = "Просмотр";
		КонецЕсли;
		
		Если ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
			ДействияВФорме.СвойстваЭлемента = "Просмотр";
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ОписаниеПользователяИБ(ДляПроверкиПервогоАдминистратора = Ложь)
	
	Если УровеньДоступа.УправлениеСписком
	   И ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
		
		ПользовательИБПолноеИмя = Объект.Наименование;
	КонецЕсли;
	
	Если УровеньДоступа.АдминистраторСистемы
	 Или УровеньДоступа.ПолныеПрава Тогда
		
		Результат = Пользователи.НовоеОписаниеПользователяИБ();
		Пользователи.СкопироватьСвойстваПользователяИБ(
			Результат,
			ЭтотОбъект,
			,
			"УникальныйИдентификатор,
			|Роли",
			"ПользовательИБ");
		
		Результат.Вставить("ВходВПрограммуРазрешен", ВходВПрограммуРазрешен);
	Иначе
		Результат = Новый Структура;
		
		Если УровеньДоступа.ИзменениеТекущего Тогда
			Результат.Вставить("АдресЭлектроннойПочты", ПользовательИБАдресЭлектроннойПочты);
			Результат.Вставить("Пароль",                ПользовательИБПароль);
			Результат.Вставить("Язык",                  ПользовательИБЯзык);
		КонецЕсли;
		
		Если УровеньДоступа.УправлениеСписком Тогда
			Результат.Вставить("АдресЭлектроннойПочты",          ПользовательИБАдресЭлектроннойПочты);
			Результат.Вставить("ВходВПрограммуРазрешен",         ВходВПрограммуРазрешен);
			Результат.Вставить("ПоказыватьВСпискеВыбора",        ПользовательИБПоказыватьВСпискеВыбора
				И Не ВнешниеПользователи.ИспользоватьВнешнихПользователей());
			Результат.Вставить("ЗапрещеноИзменятьПароль",        ПользовательИБЗапрещеноИзменятьПароль);
			Результат.Вставить("ЗапрещеноВосстанавливатьПароль", ПользовательИБЗапрещеноВосстанавливатьПароль);
			Результат.Вставить("Язык",                           ПользовательИБЯзык);
			Результат.Вставить("РежимЗапуска",                   ПользовательИБРежимЗапуска);
			
			Если ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
				Результат.Вставить("ПолноеИмя", ПользовательИБПолноеИмя);
			КонецЕсли;
		КонецЕсли;
		
		Если УровеньДоступа.НастройкиДляВхода Тогда
			Результат.Вставить("АутентификацияСтандартная",    ПользовательИБАутентификацияСтандартная);
			Результат.Вставить("Имя",                          ПользовательИБИмя);
			Результат.Вставить("Пароль",                       ПользовательИБПароль);
			Результат.Вставить("АутентификацияOpenID",         ПользовательИБАутентификацияOpenID);
			Результат.Вставить("АутентификацияOpenIDConnect",  ПользовательИБАутентификацияOpenIDConnect);
			Результат.Вставить("АутентификацияТокеномДоступа", ПользовательИБАутентификацияТокеномДоступа);
			Результат.Вставить("АутентификацияОС",             ПользовательИБАутентификацияОС);
			Результат.Вставить("ПользовательОС",               ПользовательИБПользовательОС);
		КонецЕсли;
	КонецЕсли;
	
	Если Не УровеньДоступа.НастройкиДляВхода Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если Не ПользователиСлужебный.ЗапретРедактированияРолей() Тогда
		ТекущиеРоли = ПользовательИБРоли.Выгрузить(, "Роль").ВыгрузитьКолонку("Роль");
		Результат.Вставить("Роли", ТекущиеРоли);
	КонецЕсли;
	
	Если ДляПроверкиПервогоАдминистратора Тогда
		Возврат Результат;
	КонецЕсли;
	
	// Добавление ролей требуемых при создании первого администратора.
	Если ПользователиСлужебный.ТребуетсяСоздатьПервогоАдминистратора(Результат) Тогда
		
		Если Результат.Свойство("Роли") И Результат.Роли <> Неопределено Тогда
			РолиАдминистратора = Результат.Роли;
		Иначе
			РолиАдминистратора = Новый Массив;
		КонецЕсли;
		
		Если РолиАдминистратора.Найти("ПолныеПрава") = Неопределено Тогда
			РолиАдминистратора.Добавить("ПолныеПрава");
		КонецЕсли;
		
		Если РолиАдминистратора.Найти("АдминистраторСистемы") = Неопределено Тогда
			РолиАдминистратора.Добавить("АдминистраторСистемы");
		КонецЕсли;
		Результат.Вставить("Роли", РолиАдминистратора);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса = Неопределено)
	
	Возврат ПользователиСлужебный.ТребуетсяСоздатьПервогоАдминистратора(
		ОписаниеПользователяИБ(Истина), ТекстВопроса);
	
КонецФункции

&НаСервереБезКонтекста
Функция СписокПользователейИБПустой()
	
	УстановитьПривилегированныйРежим(Истина);
	
	Возврат Не ЗначениеЗаполнено(ПользователиИнформационнойБазы.ТекущийПользователь().Имя)
		И ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() = 0;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьНеобходимостьСинхронизацииССервисом(Форма)
	
	Форма.ТребуетсяСинхронизацияССервисом = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопросОЗаписиСПустымСпискомРолей(Ответ, ПараметрыЗаписи) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ПараметрыЗаписи.Вставить("СПустымСпискомРолей");
		Записать(ПараметрыЗаписи);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьПервогоАдминистратора() 
	
	ПараметрыЗаписи = ПараметрыЗаписиПриПроверкеПервогоАдминистратора;
	ПараметрыЗаписиПриПроверкеПервогоАдминистратора = Неопределено;
	
	ТекстВопроса = "";
	Если Не ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса) Тогда
		ПараметрыЗаписи.Вставить("ССозданиемПервогоАдминистратора");
		Попытка
			Записать(ПараметрыЗаписи);
		Исключение
			ПарольПользователяСервиса = Неопределено;
			ВызватьИсключение;
		КонецПопытки;
		Возврат;
	КонецЕсли;
	
	ЗаголовокВопроса = НСтр("ru = 'Запись пользователя информационной базы'");
	ПоказатьВопрос(
		Новый ОписаниеОповещения("ПослеПодтвержденияСозданияПервогоАдминистратора", ЭтотОбъект, ПараметрыЗаписи),
		ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеПодтвержденияСозданияПервогоАдминистратора(Ответ, ПараметрыЗаписи) Экспорт
	
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	ВходВПрограммуРазрешен = Истина;
	ПользовательИБАутентификацияСтандартная = Истина;
	
	ОбновитьСвойствоПоказыватьВСпискеВыбора();
	
	ПараметрыЗаписи.Вставить("ССозданиемПервогоАдминистратора");
	Записать(ПараметрыЗаписи);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопросОКопированииПрав(Ответ, ПараметрыЗаписи) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ПараметрыЗаписи.Вставить("КопироватьПраваПользователя");
	Иначе
		ПараметрыЗаписи.Вставить("НеКопироватьПраваПользователя");
	КонецЕсли;
	Записать(ПараметрыЗаписи);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписиЗавершение(Результат, ПараметрыЗаписи) Экспорт
	
	Если ПараметрыЗаписи <> Неопределено И ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда
		ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьФорму()
	
	Закрыть();
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Поддержка контактной информации.

&НаСервере
Процедура ОбновитьКонтактнуюИнформацию(Результат)
	
	МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
	МодульУправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтотОбъект, Объект, Результат);
	
КонецПроцедуры

&НаСервере
Процедура ПереопределитьРедактированиеКонтактнойИнформацииВСервисе()
	
	Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда
		Возврат;
	КонецЕсли;
	
	КонтактнаяИнформация = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
	
	СтрокаEMail = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", ВидКонтактнойИнформации("EmailПользователя")))[0];
	ЭлементEMail = Элементы[СтрокаEMail.ИмяРеквизита];
	ЭлементEMail.УстановитьДействие("ПриИзменении", "Подключаемый_EMailПриИзменении");
	ЭлементEMail.УстановитьДействие("Очистка",      "Подключаемый_EMailОчистка");
	ЭлементEMail.АвтоОтметкаНезаполненного = Истина;
	
	ЭлементEMail.КнопкаВыбора = ЗначениеЗаполнено(Объект.Ссылка) И ЗначениеЗаполнено(ЭтотОбъект[СтрокаEMail.ИмяРеквизита]);
	ЭлементEMail.РедактированиеТекста = Не ЭлементEMail.КнопкаВыбора;
	ЭлементEMail.УстановитьДействие("НачалоВыбора", "Подключаемый_EMailНачалоВыбора");
	
	СтрокаТелефон = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", ВидКонтактнойИнформации("ТелефонПользователя")))[0];
	ЭлементТелефон = Элементы[СтрокаТелефон.ИмяРеквизита];
	ЭлементТелефон.УстановитьДействие("ПриИзменении", "Подключаемый_ТелефонПриИзменении");
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьСпособИзмененияEMailВСервисе()
	
	Если Не ОбщегоНазначения.РазделениеВключено() Тогда
		Возврат;
	КонецЕсли;
	
	КонтактнаяИнформация = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
	
	СтрокаEMail = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", ВидКонтактнойИнформации("EmailПользователя")))[0];
	ЭлементEMail = Элементы[СтрокаEMail.ИмяРеквизита];
	
	ЭлементEMail.КнопкаВыбора = ЗначениеЗаполнено(Объект.Ссылка) И ЗначениеЗаполнено(ЭтотОбъект[СтрокаEMail.ИмяРеквизита]);
	ЭлементEMail.РедактированиеТекста = Не ЭлементEMail.КнопкаВыбора;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВидКонтактнойИнформации(ИмяВида)
	
	МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
	Возврат МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени(ИмяВида);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ВидКонтактнойИнформацииEmailПользователя()
	
	ИмяПредопределенногоЗначения = "Справочник." + "ВидыКонтактнойИнформации" + ".EmailПользователя";
	
	Возврат ПредопределенноеЗначение(ИмяПредопределенногоЗначения);
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Поддержка дополнительных реквизитов.

&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обработка пользователя ИБ

&НаСервере
Функция НачальноеОписаниеПользователяИБ()
	
	УстановитьПривилегированныйРежим(Истина);
	
	Если НачальноеОписаниеПользователяИБ <> Неопределено Тогда
		НачальноеОписаниеПользователяИБ.Роли = Новый Массив;
		Возврат НачальноеОписаниеПользователяИБ;
	КонецЕсли;
	
	ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
	
	Если ОбщегоНазначения.РазделениеВключено()
	 Или ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда
		ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
	Иначе
		ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора =
			    ОбщаяНастройкаПоказыватьВСпискеВыбора = "ВключеноДляНовыхПользователей"
			Или ОбщаяНастройкаПоказыватьВСпискеВыбора = "СкрытоИВключеноДляВсехПользователей";
	КонецЕсли;
	ОписаниеПользователяИБ.Роли = Новый Массив;
	
	Возврат ОписаниеПользователяИБ;
	
КонецФункции

&НаСервере
Процедура ПрочитатьПользователяИБ(ПриКопированииЭлемента = Ложь)
	
	УстановитьПривилегированныйРежим(Истина);
	
	ПрочитанныеСвойства      = Неопределено;
	ОписаниеПользователяИБ   = НачальноеОписаниеПользователяИБ();
	ПользовательИБСуществует = Ложь;
	ПользовательИБОсновной   = Ложь;
	ВходВПрограммуРазрешен   = Ложь;
	ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Ложь;
	
	Если ПриКопированииЭлемента Тогда
		
		ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ);
		Если ПрочитанныеСвойства <> Неопределено Тогда
			
			// Сопоставление пользователя ИБ с пользователем в справочнике.
			Если Пользователи.ВходВПрограммуРазрешен(ПрочитанныеСвойства) Тогда
				ВходВПрограммуРазрешен = Истина;
				ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Истина;
				ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
			КонецЕсли;
			
			// Копирование свойств и ролей пользователяИБ.
			ЗаполнитьЗначенияСвойств(
				ОписаниеПользователяИБ,
				ПрочитанныеСвойства,
				"ЗапрещеноИзменятьПароль,
				|ПоказыватьВСпискеВыбора,
				|ОсновнойИнтерфейс,
				|РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ",
				|Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ",
				|Роли"));
		КонецЕсли;
		Объект.ИдентификаторПользователяИБ = Неопределено;
		УстановитьНаличиеПароля(ЭтотОбъект, Ложь, Пользователи.АвторизованныйПользователь());
	Иначе
		ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ);
		Если ПрочитанныеСвойства <> Неопределено Тогда
		
			ПользовательИБСуществует = Истина;
			ПользовательИБОсновной = Истина;
		
		ИначеЕсли Параметры.Свойство("ИдентификаторПользователяИБ")
		        И ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда
			
			Если Объект.ИдентификаторПользователяИБ <> Параметры.ИдентификаторПользователяИБ Тогда
				Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ;
				Модифицированность = Истина;
			КонецЕсли;
			ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ);
			Если ПрочитанныеСвойства <> Неопределено Тогда
				
				ПользовательИБСуществует = Истина;
				Если Объект.Наименование <> ПрочитанныеСвойства.ПолноеИмя Тогда
					Объект.Наименование = ПрочитанныеСвойства.ПолноеИмя;
					Модифицированность = Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		Если ПользовательИБСуществует Тогда
			
			Если Пользователи.ВходВПрограммуРазрешен(ПрочитанныеСвойства) Тогда
				ВходВПрограммуРазрешен = Истина;
				ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Истина;
			КонецЕсли;
			
			ЗаполнитьЗначенияСвойств(
				ОписаниеПользователяИБ,
				ПрочитанныеСвойства,
				"Имя,
				|ПолноеИмя,
				|АдресЭлектроннойПочты,
				|АутентификацияСтандартная,
				|ПоказыватьВСпискеВыбора,
				|ЗапрещеноИзменятьПароль,
				|ЗапрещеноВосстанавливатьПароль,
				|АутентификацияOpenID,
				|АутентификацияOpenIDConnect,
				|АутентификацияТокеномДоступа,
				|АутентификацияОС,
				|ПользовательОС,
				|ОсновнойИнтерфейс,
				|РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ",
				|Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ",
				|Роли") + ",
				|ЗащитаОтОпасныхДействий");
		КонецЕсли;
		
		Если ПрочитанныеСвойства = Неопределено Тогда
			УстановитьНаличиеПароля(ЭтотОбъект, Ложь,
				Пользователи.АвторизованныйПользователь());
		Иначе
			УстановитьНаличиеПароля(ЭтотОбъект, ПрочитанныеСвойства.ПарольУстановлен,
				Пользователи.АвторизованныйПользователь());
		КонецЕсли;
	КонецЕсли;
	
	Пользователи.СкопироватьСвойстваПользователяИБ(
		ЭтотОбъект,
		ОписаниеПользователяИБ,
		,
		"УникальныйИдентификатор,
		|Роли" + ?(ВнешниеПользователи.ИспользоватьВнешнихПользователей(), ",
		|ПоказыватьВСпискеВыбора", ""),
		"ПользовательИБ");
	
	Если ПользовательИБОсновной И Не ВходВПрограммуРазрешен Тогда
		ХранимыеСвойства = ПользователиСлужебный.ХранимыеСвойстваПользователяИБ(Объект.Ссылка);
		ПользовательИБАутентификацияСтандартная    = ХранимыеСвойства.АутентификацияСтандартная;
		ПользовательИБАутентификацияOpenID         = ХранимыеСвойства.АутентификацияOpenID;
		ПользовательИБАутентификацияOpenIDConnect  = ХранимыеСвойства.АутентификацияOpenIDConnect;
		ПользовательИБАутентификацияТокеномДоступа = ХранимыеСвойства.АутентификацияТокеномДоступа;
		ПользовательИБАутентификацияОС             = ХранимыеСвойства.АутентификацияОС;
	КонецЕсли;
	
	Если ПользовательИБСуществует Тогда
		ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения
			= ПользовательИБАутентификацияСтандартная;
	КонецЕсли;
	
	ОбработатьИнтерфейсРолей("ЗаполнитьРоли", ОписаниеПользователяИБ.Роли);
	
	ПриЧтенииВходВПрограммуРазрешен = ВходВПрограммуРазрешен;
	
КонецПроцедуры

&НаСервере
Процедура ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи = Неопределено)
	
	// Проверка соответствия свойства ПолноеИмя пользователяИБ и
	// реквизита Наименование пользователя.
	
	ПоказатьНесоответствие = Истина;
	ПоказатьКомандыУстраненияРазличий = Ложь;
	
	Если НЕ ПользовательИБСуществует Тогда
		ПоказатьНесоответствие = Ложь;
		
	ИначеЕсли Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
		Объект.Наименование = ПользовательИБПолноеИмя;
		ПоказатьНесоответствие = Ложь;
		
	ИначеЕсли УровеньДоступа.УправлениеСписком Тогда
		
		УточнениеСвойств = Новый Массив;
		
		Если ПользовательИБПолноеИмя <> Объект.Наименование Тогда
			ПоказатьКомандыУстраненияРазличий =
				    ПоказатьКомандыУстраненияРазличий
				Или ДействияВФорме.СвойстваЭлемента = "Редактирование";
			
			УточнениеСвойств.Вставить(0, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Полное имя ""%1""'"),
				ПользовательИБПолноеИмя));
		КонецЕсли;
		
		Если ПриЧтенииВходВПрограммуРазрешен И Объект.Недействителен Тогда
			ВходВПрограммуРазрешен = Ложь;
			ПоказатьКомандыУстраненияРазличий =
				    ПоказатьКомандыУстраненияРазличий
				Или ДействияВФорме.СвойстваЭлемента = "Редактирование";
			
			УточнениеСвойств.Вставить(0, НСтр("ru = 'Вход в программу разрешен'"));
		КонецЕсли;
		
		// Проверка на соответствие почты
		Если УровеньДоступа.ИзменениеТекущего Тогда
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
				
				МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
				
				СтрокаОписания = МодульУправлениеКонтактнойИнформацией.СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы(
					ЭтотОбъект, ВидКонтактнойИнформации("EmailПользователя"), ПользовательИБАдресЭлектроннойПочты);
				
				Если СтрокаОписания = Неопределено Тогда
					ПоказатьКомандыУстраненияРазличий =
						    ПоказатьКомандыУстраненияРазличий
						Или ДействияВФорме.СвойстваЭлемента = "Редактирование";
					
					УточнениеСвойств.Вставить(0, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Почта для восстановления пароля ""%1""'"),
						ПользовательИБАдресЭлектроннойПочты));
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		УстановитьПривилегированныйРежим(Истина);
		ОтличаютсяСохраненныеСвойстваПользователяИБ = ЗначениеЗаполнено(Объект.Ссылка)
			И РегистрыСведений.СведенияОПользователях.ОтличаютсяСохраненныеСвойстваПользователяИБ(Объект);
		УстановитьПривилегированныйРежим(Ложь);
		
		ПоказатьКомментарийУстраненияРазличий =
			    ПоказатьКомандыУстраненияРазличий
			Или ОтличаютсяСохраненныеСвойстваПользователяИБ
			  И ДействияВФорме.СвойстваЭлемента = "Редактирование";
		
		Если УточнениеСвойств.Количество() > 0
		 Или ОтличаютсяСохраненныеСвойстваПользователяИБ Тогда
			
			СтрокаУточненияСвойств = "";
			ТекущаяСтрока = "";
			Для каждого УточнениеСвойства Из УточнениеСвойств Цикл
				Если СтрДлина(ТекущаяСтрока + УточнениеСвойства) > 90 Тогда
					СтрокаУточненияСвойств = СтрокаУточненияСвойств + СокрП(ТекущаяСтрока) + ", " + Символы.ПС;
					ТекущаяСтрока = "";
				КонецЕсли;
				ТекущаяСтрока = ТекущаяСтрока + ?(ЗначениеЗаполнено(ТекущаяСтрока), ", ", "") + УточнениеСвойства;
			КонецЦикла;
			Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда
				СтрокаУточненияСвойств = СтрокаУточненияСвойств + ТекущаяСтрока;
			КонецЕсли;
			Если ПоказатьКомментарийУстраненияРазличий Тогда
				Рекомендация = Символы.ПС
					+ НСтр("ru = 'Нажмите ""Записать"", чтобы устранить различия и не выводить это предупреждение.'");
			
			ИначеЕсли Не Пользователи.ЭтоПолноправныйПользователь() Тогда
				Рекомендация = Символы.ПС
					+ НСтр("ru = 'Обратитесь к администратору, чтобы устранить различия.'");
			Иначе
				Рекомендация = "";
			КонецЕсли;
			Если ЗначениеЗаполнено(СтрокаУточненияСвойств) Тогда
				ПояснениеНесоответствия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Следующие свойства пользователя информационной базы отличаются от указанных в этой форме:
					           |%1.'"),
					СтрокаУточненияСвойств) + ?(Не ОтличаютсяСохраненныеСвойстваПользователяИБ, "", "
					|" + НСтр("ru = 'Картинка в списке пользователей может отображать устаревшее состояние,
					                |так как отличаются и некоторые другие сохраненные свойства.'"));
			Иначе
				ПояснениеНесоответствия =
					НСтр("ru = 'Картинка в списке пользователей может отображать устаревшее состояние,
					           |так как некоторые свойства пользователя информационной базы отличаются от сохраненных.'");
			КонецЕсли;
			Элементы.СвойстваПояснениеНесоответствия.Заголовок = ПояснениеНесоответствия + Рекомендация;
		Иначе
			ПоказатьНесоответствие = Ложь;
		КонецЕсли;
	Иначе
		ПоказатьНесоответствие = Ложь;
	КонецЕсли;
	
	Элементы.СвойстваОбработкаНесоответствия.Видимость   = ПоказатьНесоответствие;
	Элементы.СвойстваКомандыУстраненияРазличий.Видимость = ПоказатьКомандыУстраненияРазличий;
	Элементы.СвойстваПояснениеНесоответствия.ВертикальноеПоложение = ?(ЗначениеЗаполнено(Рекомендация),
		ВертикальноеПоложениеЭлемента.Верх, ВертикальноеПоложениеЭлемента.Центр);
	
	// Определение сопоставление несуществующего пользователя ИБ с пользователем в справочнике.
	ЕстьНовоеСопоставлениеСНесуществующимПользователемИБ
		= НЕ ПользовательИБСуществует
		И ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ);
	
	Если ПараметрыЗаписи <> Неопределено
	   И ЕстьСопоставлениеСНесуществующимПользователемИБ
	   И НЕ ЕстьНовоеСопоставлениеСНесуществующимПользователемИБ Тогда
		
		ПараметрыЗаписи.Вставить("ОчищеноСопоставлениеСНесуществующимПользователемИБ", Объект.Ссылка);
	КонецЕсли;
	ЕстьСопоставлениеСНесуществующимПользователемИБ = ЕстьНовоеСопоставлениеСНесуществующимПользователемИБ;
	
	Если УровеньДоступа.УправлениеСписком Тогда
		Элементы.СопоставлениеОбработкаНесоответствия.Видимость = ЕстьСопоставлениеСНесуществующимПользователемИБ;
	Иначе
		// Сопоставление не может быть изменено.
		Элементы.СопоставлениеОбработкаНесоответствия.Видимость = Ложь;
	КонецЕсли;
	
	Если ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
		Рекомендация = Символы.ПС
			+ НСтр("ru = 'Нажмите ""Записать"", чтобы устранить проблему и не выводить это предупреждение.'");
		
	ИначеЕсли Не Пользователи.ЭтоПолноправныйПользователь() Тогда
		Рекомендация = Символы.ПС
			+ НСтр("ru = 'Обратитесь к администратору, чтобы устранить различия.'");
	Иначе
		Рекомендация = "";
	КонецЕсли;
	
	Элементы.СопоставлениеПояснениеНесоответствия.Заголовок =
		НСтр("ru = 'Несуществующий пользователь информационной базы.'") + Рекомендация;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоляПоПользователюИБНаСервере()
	
	Если УровеньДоступа.УправлениеСписком
	   И ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
		
		Объект.Наименование = ПользовательИБПолноеИмя;
		ЗаполнитьПолеПочтыДляВосстановленияПароляИзИБ();
		
	КонецЕсли;
	
	ОпределитьНесоответствияПользователяСПользователемИБ();
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
	УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПолеПочтыДляВосстановленияПароляИзИБ()
	
	Если ПустаяСтрока(ИмяРеквизитаСПочтойДляВосстановленияПароля) Тогда
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		
		ПочтаДляВосстановленияПароляИзОбъекта = Новый Структура(ИмяРеквизитаСПочтойДляВосстановленияПароля, Неопределено);
		ЗаполнитьЗначенияСвойств(ПочтаДляВосстановленияПароляИзОбъекта, ЭтотОбъект);
		
		Если ЗначениеЗаполнено(ПочтаДляВосстановленияПароляИзОбъекта[ИмяРеквизитаСПочтойДляВосстановленияПароля])
			Или ПочтаДляВосстановленияПароляИзОбъекта[ИмяРеквизитаСПочтойДляВосстановленияПароля] <> ПользовательИБАдресЭлектроннойПочты Тогда
			
			ВидEmailПользователя = ВидКонтактнойИнформации("EmailПользователя");
			ОписаниеПочты = МодульУправлениеКонтактнойИнформацией.СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы(ЭтотОбъект, ВидEmailПользователя, ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]);
			
			Если ОписаниеПочты <> Неопределено Тогда
				ОписаниеПочты.Представление = ПользовательИБАдресЭлектроннойПочты;
				ОписаниеПочты.Значение = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(
					ПользовательИБАдресЭлектроннойПочты, ВидEmailПользователя);
				
				ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] = ПользовательИБАдресЭлектроннойПочты;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Начальное заполнение, проверка заполнения, доступность свойств.

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьСвойств(Форма)
	
	Элементы       = Форма.Элементы;
	Объект         = Форма.Объект;
	УровеньДоступа = Форма.УровеньДоступа;
	ДействияСПользователемСервиса = Форма.ДействияСПользователемСервиса;
	
	// Пояснение состояния "Нет входа".
	Если Форма.ВходВПрограммуРазрешен Тогда
		Элементы.ГруппаНетПрав.Видимость         = Форма.НаличиеПрав.НетПрав;
		Элементы.ГруппаНетПравНаЗапуск.Видимость = Не Форма.НаличиеПрав.НетПрав
			И Форма.НаличиеПрав.НедостаточноПравДляЗапуска;
		Элементы.ГруппаНетПравНаВход.Видимость   = Не Форма.НаличиеПрав.НетПрав
			И Не Форма.НаличиеПрав.НедостаточноПравДляЗапуска
			И Форма.НаличиеПрав.НедостаточноПравДляВхода;
	Иначе
		Элементы.ГруппаНетПрав.Видимость         = Ложь;
		Элементы.ГруппаНетПравНаЗапуск.Видимость = Ложь;
		Элементы.ГруппаНетПравНаВход.Видимость   = Ложь;
	КонецЕсли;
	
	// Настройка возможности изменения.
	Элементы.ВходВПрограммуРазрешен.ТолькоПросмотр =
		Не (  Элементы.СвойстваПользователяИБ.ТолькоПросмотр = Ложь
		    И (    УровеньДоступа.ИзменениеРазрешенияНаВход
		       Или УровеньДоступа.ОтключениеРазрешенияНаВход И Форма.ПриЧтенииВходВПрограммуРазрешен));
	
	Элементы.СменитьПароль.Доступность =
		(    УровеньДоступа.НастройкиДляВхода
		 Или УровеньДоступа.ИзменениеТекущего
		   И Не Форма.ПользовательИБЗапрещеноИзменятьПароль)
		И Не Объект.Служебный;
	
	ОбновитьИмяДляВхода(Форма);
	
	// Настройка доступности связанных элементов.
	Элементы.ВходВПрограммуРазрешен.Доступность    = Не Объект.Недействителен;
	Элементы.СвойстваПользователяИБ.Доступность    = Не Объект.Недействителен;
	Элементы.ГруппаИмя.Доступность                 = Не Объект.Недействителен;
	Элементы.ГруппаИзменитьОграничение.Доступность = Не Объект.Недействителен
	                                               И Не Элементы.Наименование.ТолькоПросмотр;
	
	Элементы.ПараметрыАутентификации1СПредприятия.Доступность = Форма.ПользовательИБАутентификацияСтандартная;
	Элементы.ПользовательИБПользовательОС.Доступность         = Форма.ПользовательИБАутентификацияОС;
	
	Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Доступность = Не Форма.ПользовательИБЗапрещеноИзменятьПароль;
	
	// Уточнение настроек в модели сервиса.
	Если ДействияСПользователемСервиса <> Неопределено Тогда
		
		// Доступность редактирования КИ.
		Отбор = Новый Структура("Вид", ВидКонтактнойИнформацииEmailПользователя());
		НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
		ЗаполненEMail = (НайденныеСтроки <> Неопределено) И ЗначениеЗаполнено(Форма[НайденныеСтроки[0].ИмяРеквизита]);
		Если Объект.Ссылка.Пустая() И ЗаполненEMail Тогда
			МожноИзменятьПароль = Ложь;
		Иначе
			МожноИзменятьПароль = ДействияСПользователемСервиса.ИзменениеПароля;
		КонецЕсли;
		
		Элементы.СменитьПароль.Доступность = Элементы.СменитьПароль.Доступность И МожноИзменятьПароль;
		
		Элементы.ПользовательИБИмя.ТолькоПросмотр = Элементы.ПользовательИБИмя.ТолькоПросмотр
			ИЛИ НЕ ДействияСПользователемСервиса.ИзменениеИмени;
		
		Элементы.Наименование.ТолькоПросмотр = Элементы.Наименование.ТолькоПросмотр 
			ИЛИ НЕ ДействияСПользователемСервиса.ИзменениеПолногоИмени;
		
		Элементы.ВходВПрограммуРазрешен.Доступность = Элементы.ВходВПрограммуРазрешен.Доступность
			И ДействияСПользователемСервиса.ИзменениеДоступа;
		
		Элементы.Недействителен.Доступность = Элементы.Недействителен.Доступность
			И ДействияСПользователемСервиса.ИзменениеДоступа;
		
		Форма.ЗапретИзмененияАдминистративногоДоступа =
			НЕ ДействияСПользователемСервиса.ИзменениеАдминистративногоДоступа;
	КонецЕсли;
	
	ПользователиСлужебныйКлиентСервер.ОбновитьОграничениеСрокаДействия(Форма);
	
КонецПроцедуры

&НаСервере
Функция ОпределитьДоступностьЭлементовКонтактнойИнформации()
	
	Результат = Новый Соответствие;
	Для Каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл // СтрокаТаблицыЗначений из см. УправлениеКонтактнойИнформацией.НоваяКонтактнаяИнформация
		ДействияВидаКонтактнойИнформации = ДействияСПользователемСервиса.КонтактнаяИнформация.Получить(СтрокаКонтактнойИнформации.Вид);
		Если ДействияВидаКонтактнойИнформации = Неопределено Тогда
			// Возможность редактирования этого вида КИ не регулируется менеджером сервиса.
			Продолжить;
		КонецЕсли;
		ЭлементКонтактнойИнформации = Элементы[СтрокаКонтактнойИнформации.ИмяРеквизита];
		Результат.Вставить(СтрокаКонтактнойИнформации.Вид,
			Не ЭлементКонтактнойИнформации.ТолькоПросмотр
			И ДействияВидаКонтактнойИнформации.Изменение);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

// Продолжение процедуры ИзменитьОграничениеНаВходВПрограмму.
&НаКлиенте
Процедура ИзменитьОграничениеНаВходВПрограммуЗавершение(Результат, Контекст) Экспорт
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ТребуетсяЗаписьПользователяИБ(Форма, УчитыватьСтандартноеИмя = Истина)
	
	Если Форма.ДействияВФорме.СвойстваПользователяИБ <> "Редактирование" Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Шаблон = Форма.НачальноеОписаниеПользователяИБ;
	
	ТекущееИмя = "";
	Если Не УчитыватьСтандартноеИмя Тогда
		КраткоеИмя = ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(
			Форма.Объект.Наименование);
		
		Если Форма.ПользовательИБИмя = КраткоеИмя Тогда
			ТекущееИмя = КраткоеИмя;
		КонецЕсли;
	КонецЕсли;
	
	Если Форма.ПользовательИБСуществует
	 Или Форма.ВходВПрограммуРазрешен
	 Или Форма.ПользовательИБИмя                          <> ТекущееИмя
	 Или Форма.ПользовательИБАутентификацияСтандартная    <> Шаблон.АутентификацияСтандартная
	 Или Форма.ПользовательИБПоказыватьВСпискеВыбора      <> Шаблон.ПоказыватьВСпискеВыбора
	 Или Форма.ПользовательИБЗапрещеноИзменятьПароль      <> Шаблон.ЗапрещеноИзменятьПароль
	 Или Форма.ПользовательИБПароль                       <> Неопределено
	 Или Форма.ПользовательИБАутентификацияOpenID         <> Шаблон.АутентификацияOpenID
	 Или Форма.ПользовательИБАутентификацияOpenIDConnect  <> Шаблон.АутентификацияOpenIDConnect
	 Или Форма.ПользовательИБАутентификацияТокеномДоступа <> Шаблон.АутентификацияТокеномДоступа
	 Или Форма.ПользовательИБАутентификацияОС             <> Шаблон.АутентификацияОС
	 Или Форма.ПользовательИБПользовательОС               <> ""
	 Или Форма.ПользовательИБРежимЗапуска                 <> Шаблон.РежимЗапуска
	 Или Форма.ПользовательИБЯзык                         <> Шаблон.Язык
	 Или Форма.ПользовательИБРоли.Количество()            <> 0 Тогда
		
		Возврат Истина;
	КонецЕсли;
	
	// Поддерживается в новых версиях платформы
	Если Шаблон.Свойство("ЗапрещеноВосстанавливатьПароль")
		 И Форма.ПользовательИБЗапрещеноВосстанавливатьПароль <> Шаблон.ЗапрещеноВосстанавливатьПароль Тогда
			Возврат Истина;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

// СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
	МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
	МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
	МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

////////////////////////////////////////////////////////////////////////////////
// Для работы интерфейса ролей.

&НаСервере
Процедура ОбработатьИнтерфейсРолей(Действие, ОсновнойПараметр = Неопределено)
	
	ПараметрыДействия = Новый Структура;
	ПараметрыДействия.Вставить("ОсновнойПараметр", ОсновнойПараметр);
	ПараметрыДействия.Вставить("Форма",            ЭтотОбъект);
	ПараметрыДействия.Вставить("КоллекцияРолей",   ПользовательИБРоли);
	ПараметрыДействия.Вставить("ЗапретИзмененияАдминистративногоДоступа",
		ЗапретИзмененияАдминистративногоДоступа);
	
	ПараметрыДействия.Вставить("НазначениеРолей", "ДляАдминистраторов");
	
	БылУстановленАдминистративныйДоступ = ПользовательИБРоли.НайтиСтроки(
		Новый Структура("Роль", "ПолныеПрава")).Количество() > 0;
	
	ПользователиСлужебный.ОбработатьИнтерфейсРолей(Действие, ПараметрыДействия);
	
	УстановленАдминистративныйДоступ = ПользовательИБРоли.НайтиСтроки(
		Новый Структура("Роль", "ПолныеПрава")).Количество() > 0;
	
	Если УстановленАдминистративныйДоступ <> БылУстановленАдминистративныйДоступ Тогда
		УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти